001 /*
002 * Copyright (c) 2005 Stephen J. McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.metro.tools;
020
021 import java.util.List;
022 import java.util.LinkedList;
023
024 import net.dpml.metro.info.Priority;
025 import net.dpml.metro.data.CategoryDirective;
026 import net.dpml.metro.data.CategoriesDirective;
027
028 import org.apache.tools.ant.BuildException;
029
030 /**
031 * Build datatype used to construct a categories descriptor.
032 *
033 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
034 * @version 1.1.0
035 */
036 public class CategoriesDataType
037 {
038 private List m_list = new LinkedList();
039
040 /**
041 * CategoryDataType creation function invoked by the ant builder
042 * for all nested 'category' elements.
043 *
044 * @return a datatype used to construct a category descriptor
045 */
046 public CategoryDataType createCategory()
047 {
048 CategoryDataType category = new CategoryDataType();
049 m_list.add( category );
050 return category;
051 }
052
053 /**
054 * Utility method used to construct a CategoriesDirective based on
055 * build time features assigned by ant.
056 * @return the CategoriesDirective containing zero or more CategoryDirective instances
057 */
058 public CategoriesDirective getCategoriesDirective()
059 {
060 CategoryDataType[] types = (CategoryDataType[]) m_list.toArray( new CategoryDataType[0] );
061 CategoryDirective[] directives = new CategoryDirective[ types.length ];
062 for( int i=0; i<types.length; i++ )
063 {
064 CategoryDataType type = types[i];
065 directives[i] = type.getCategoryDirective();
066 }
067 return new CategoriesDirective( directives );
068 }
069
070 /**
071 * Build datatype used to construct a categories descriptor.
072 */
073 public class CategoryDataType
074 {
075 private String m_name;
076 private String m_priority;
077 private String m_target;
078
079 /**
080 * Set the category name.
081 * @param name the category name
082 */
083 public void setName( String name )
084 {
085 m_name = name;
086 }
087
088 /**
089 * Set the category priority.
090 * @param priority the category priority
091 */
092 public void setPriority( String priority )
093 {
094 m_priority = priority;
095 }
096
097 /**
098 * Set the category target.
099 * @param target the category target
100 */
101 public void setTarget( String target )
102 {
103 m_target = target;
104 }
105
106 /**
107 * Return the category directive.
108 * @return the directive
109 */
110 public CategoryDirective getCategoryDirective()
111 {
112 if( null == m_name )
113 {
114 throw new BuildException( "Missing category name." );
115 }
116 Priority priority = getPriority();
117 return new CategoryDirective( m_name, priority, m_target );
118 }
119
120 private Priority getPriority()
121 {
122 if( null == m_priority )
123 {
124 return null;
125 }
126 else
127 {
128 return Priority.parse( m_priority );
129 }
130 }
131 }
132 }
133